package com.portal.framework.util;

import java.math.BigDecimal;

public abstract class MathUtil {
	public static Number min(Number... is) {
		if (is == null || is.length == 0) {
			return 0;
		}
		double ret = Double.MAX_VALUE;
		for (Number i : is) {
			ret = Math.min(new NumberWrapper(i).doubleValue(), ret);
		}
		return ret;
	}

	public static Number max(Number... ns) {
		if (ns == null || ns.length == 0) {
			return 0;
		}
		double ret = Double.MIN_VALUE;
		for (Number i : ns) {
			ret = Math.max(new NumberWrapper(i).doubleValue(), ret);
		}
		return ret;
	}

	public static double round(Double num, int point) {
		if (num == null) {
			return 0.00;
		}
		BigDecimal b1 = new BigDecimal(doubleValue(num));
		return b1.setScale(point, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/**
	 * 
	 * 提供精确的加法运算。
	 * 
	 * @param v1
	 *            被加数
	 * 
	 * @param v2
	 *            加数
	 * 
	 * @return 两个参数的和
	 * 
	 */

	public static double add(Double v1, Double v2) {
		BigDecimal b1 = new BigDecimal(doubleValue(v1));
		BigDecimal b2 = new BigDecimal(doubleValue(v2));
		return b1.add(b2).doubleValue();
	}

	public static double add(Double... ds) {
		if (ds == null || ds.length == 0) {
			return 0.0;
		}

		if (ds != null && ds.length == 1) {
			return doubleValue(ds[0]);
		}

		double sum = 0.0;
		for (Double d : ds) {
			sum = add(d, sum);
		}

		return sum;
	}

	/**
	 * 提供精确的减法运算。
	 * 
	 * @param v1
	 *            被减数
	 * @param v2
	 *            减数
	 * @return 两个参数的差
	 */

	public static double sub(Double v1, Double v2) {
		BigDecimal b1 = new BigDecimal(doubleValue(v1));
		BigDecimal b2 = new BigDecimal(doubleValue(v2));
		return b1.subtract(b2).doubleValue();
	}

	/**
	 * 
	 * 提供精确的乘法运算。
	 * 
	 * @param v1
	 *            被乘数
	 * 
	 * @param v2
	 *            乘数
	 * 
	 * @return 两个参数的积
	 * 
	 */
	public static double mul(Double v1, Double v2) {
		BigDecimal b1 = new BigDecimal(doubleValue(v1));
		BigDecimal b2 = new BigDecimal(doubleValue(v2));
		return b1.multiply(b2).doubleValue();
	}

	/**
	 * Double转基本类型
	 * 
	 * @param d
	 * @return
	 */
	public static double DoubleTOdouble(Double d) {
		if (d == null || "".equals(d)) {
			return 0;
		}
		return d.doubleValue();
	}

	/**
	 * 返回两个字符串中的一个，传入值为空时返回默认的
	 * 
	 * @param v
	 *            传入的
	 * @param def
	 *            默认的
	 * @return
	 */
	static public double doubleValue(String v, double def) {
		if (StringUtils.empty(v))
			return def;
		try {
			return Double.parseDouble(v);
		} catch (Exception e) {
			return def;
		}
	}

	static public double doubleValue(Double v, double def) {
		if (v == null) {
			return 0.0;
		} else {
			return v.doubleValue();
		}
	}

	static public double doubleValue(String v) {
		return doubleValue(v, 0.0);
	}

	static public double doubleValue(Double v) {
		return doubleValue(v, 0.0);
	}

}
